package com.ruoyi.common.demo;

import com.github.s7connector.api.DaveArea;
import com.github.s7connector.api.S7Connector;
import com.github.s7connector.impl.serializer.converter.*;

import java.io.IOException;

/**
 * @author IT苏苏
 * @className ReadPLC.java
 * @Form no
 * @Description ToDo
 * @createTime 2022 年 12 月 28 日 14  14:18:16
 **/
public class ReadPLCDemo {
    //Int类型的封装类 用来转义
    private static IntegerConverter intCon = new IntegerConverter();

    private static ByteConverter byteCon = new ByteConverter();
    //String...
    private static StringConverter strCon = new StringConverter();
    //Boolean...
    private static BitConverter boolCon = new BitConverter();
    //real实数浮点...
    private static RealConverter realCon = new RealConverter();

    //获取到的数据存储
    public boolean in_bool1 = false;//bool
    public byte in_byte = 0;//byte

    public boolean in_bool2 = false;//bool
    public Integer in_int = null;//int

    public Integer in_word = null;//word
    public String in_String = "";//string
    public double in_real = 0.0;//real

    public void Cyclic_read(S7Connector connector) {
        byte[] PlcData = null;
        //读取bool型
        PlcData = connector.read(DaveArea.DB, // 选择数据区块
                1, // 区块编号
                1, // 数据值长度 boolean长度1
                0); // 开始位置偏移量
        Boolean extract_bool = boolCon.extract(new Boolean(false).getClass(), PlcData, 0, 0);//接收转换的数值
        in_bool1 = extract_bool;//赋值给全局变量
        System.out.println(in_bool1);
        //读取Byte
        PlcData = connector.read(DaveArea.DB, // 选择数据区块
                1, // 区块编号
                1, // 数据值长度 Byte长度1
                1); // 开始位置 偏移量
        Byte extract_byte = byteCon.extract(new Byte((byte) 0).getClass(), PlcData, 0, 0);
        in_byte = extract_byte;
        System.out.println(in_byte);

        //读取bool型
        PlcData = connector.read(DaveArea.DB, // 选择数据区块
                1, // 区块编号
                1, // 数据值长度 Byte长度1
                2); // 开始位置 偏移量
        Boolean extract_bool2 = boolCon.extract(new Boolean(false).getClass(), PlcData, 0, 0);//接收转换的数值
        in_bool2 = extract_bool2;//赋值给全局变量
        System.out.println(in_bool2);

        //读取word类型
        PlcData = connector.read(DaveArea.DB, // 选择数据区块
                1, // 区块编号
                2, // 数据值长度 word长度2
                4); // 开始位置 偏移量
        Integer extract_word = intCon.extract(new Integer(0).getClass(), PlcData, 0, 0);
        in_word = extract_word;
        System.out.println(in_word);
        //读取整型
        PlcData = connector.read(DaveArea.DB, // 选择数据区块
                1, // 区块编号
                2, // 数据值长度 int长度2
                6); // 开始位置 偏移量
        Integer extract_int = intCon.extract(new Integer(0).getClass(), PlcData, 0, 0);
        in_int = extract_int;
        System.out.println(in_int);

        //读取字符串型
        PlcData = connector.read(DaveArea.DB, // 选择数据区块
                1, // 区块编号
                100, // 数据值长度 String最小3 随值长度增加
                8); // 开始位置偏移量
        String extract_string = strCon.extract(new String().getClass(), PlcData, 0, 0);
        in_String = extract_string;
        System.out.println(in_String);

        //读取小数型-Real
        PlcData = connector.read(DaveArea.DB, // 选择数据区块
                1, // 区块编号
                4, // 数据值长度 real和double长度4
                110); //偏移量
        Double extract_double = realCon.extract(new Double(0).getClass(), PlcData, 0, 0);
        in_real = extract_double;
        System.out.println(in_real);
        try {
            connector.close();//关闭链接
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
